// 导入http-errors模块，用于创建HTTP错误对象
const createError = require("http-errors");

/**
 * 404错误处理中间件
 * 作用：当请求的路由不存在时，创建404错误并传递给全局错误处理器
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 * @param {Function} next - 调用下一个中间件（此处用于传递错误）
 */
exports.notFound = (req, res, next) => {
  // 创建404错误，包含请求方法和路径信息，通过next传递给全局错误处理
  next(createError(404, `路径 ${req.method} ${req.originalUrl} 不存在`));
};

/**
 * 全局错误处理中间件
 * 作用：统一处理应用中所有抛出的错误，根据环境返回适当的错误信息
 * @param {Object} err - 错误对象
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 * @param {Function} next - 调用下一个中间件（标准错误处理签名要求）
 */
exports.globalError = (err, req, res, next) => {
  // 错误消息：开发环境显示详细错误，生产环境显示通用提示
  const errorMsg =
    process.env.NODE_ENV === "development"
      ? err.message
      : "服务器内部错误，请稍后重试";

  // 错误状态码：使用错误对象自带的状态码，默认500（服务器内部错误）
  const errorStatus = err.status || 500;

  // 记录错误信息到控制台，便于开发调试和生产环境问题排查
  console.error(err);

  // 设置响应的HTTP状态码
  res.status(errorStatus);

  // 根据客户端可接受的响应格式返回错误信息
  if (req.accepts("json")) {
    // 客户端接受JSON格式：返回包含错误码、消息的JSON对象
    // 开发环境额外返回错误堆栈信息，便于调试
    res.json({
      code: errorStatus,
      msg: errorMsg,
      ...(process.env.NODE_ENV === "development" && { stack: err.stack }),
    });
  } else {
    // 客户端接受HTML格式：渲染错误页面
    res.render("error", {
      title: `${errorStatus} 错误`,
      message: errorMsg,
      // 开发环境传递完整错误对象，生产环境传递空对象
      error: process.env.NODE_ENV === "development" ? err : {},
    });
  }
};
